<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>15、Iterator 和 for...of循环——字符串的Iterator接口</title>
	</head>
	<body>
		<script type="text/javascript">
			//四、字符串的Iterator接口
			//字符串是一个类似数组的对象，也原生具有 Iterator 接口。
			var someString = 'hi';
			console.log(typeof someString[Symbol.iterator])  //function
			var iterator = someString[Symbol.iterator]();
			console.log(iterator.next()) //Object {value: "h", done: false}
			console.log(iterator.next()) //Object {value: "i", done: false}
			console.log(iterator.next()) //Object {value: undefined, done: true}
			//上面代码中，调用Symbol.iterator方法返回一个遍历器对象，在这个遍历器上可以调用 next 方法，实现对于字符串的遍历。
			//可以覆盖原生的Symbol.iterator方法，达到修改遍历器行为的目的。
			var str = new String('hi');
			console.log([...str])  //["h", "i"]
			str[Symbol.iterator] = function(){
				return {
					next:function(){
						if(this._first){
							this._first = false;
							return {value:'bye',done:false}
						}else{
							return {done:true}
						}
					},
					_first:true
				}
			}
			console.log([...str])  //["bye"]
			console.log(str)    //String {0: "h", 1: "i", length: 2, [[PrimitiveValue]]: "hi", Symbol(Symbol.iterator): function}
			//上面代码中，字符串 str 的Symbol.iterator方法被修改了，所以扩展运算符（...）返回的值变成了bye，而字符串本身还是hi。
			
		</script>
	</body>
</html>
